home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 June: Reference Library / Dev.CD Jun 96 RL / Dev.CD Jun 96 RL.toast / Technical Documentation / develop / develop Issue 24 / develop Issue 24 code / Scriptable Database 1.0a15 / Foundation / AbstractCollector.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-19  |  4.3 KB  |  114 lines  |  [TEXT/CWIE]

  1.  
  2. #ifndef __ABSTRACTCOLLECTOR__
  3. #define __ABSTRACTCOLLECTOR__
  4.  
  5. //
  6. // MoreAEM is needed for the definition of TDescriptor
  7. //
  8. #include "MoreAEM.h"
  9.  
  10. //
  11. // TObject is the base class for TAbstractCollector
  12. //
  13. #include "Object.h"
  14.  
  15. //
  16. // TBehavior is the base class for TCollectorBehavior
  17. //
  18. #include "Behavior.h"
  19.  
  20. class TAbstractScriptableObject;
  21. class TAbstractCollector;
  22. class TCollectorBehavior;
  23. class TMarkToken;
  24. class TAETransaction;
  25.  
  26. #define clCollectorBehavior        11
  27.  
  28. //========================================================================================
  29. //    Classs TCollectorBehavior
  30. //========================================================================================
  31. class TCollectorBehavior : public TBehavior
  32.     {
  33. public:
  34.     DeclareSmallClassData(TCollectorBehavior, TBehavior);
  35.  
  36.     TCollectorBehavior*        NextCollectorBehavior() const { return (TCollectorBehavior*)this->NextBehaviorOfClass(clCollectorBehavior); }
  37.     TAbstractCollector*        CollectorBehaviorOwner() const;
  38.     
  39.     virtual long            CollectorRequestDynamicBehavior(const TAETransaction& t, long requestID, void* param = nil);    
  40.     };
  41.     
  42. //========================================================================================
  43. //    Classs TAbstractCollector
  44. //========================================================================================
  45.  
  46. class TAbstractCollector : public TObject
  47. {
  48. private:
  49.     TBehavior*                        fFirstBehavior;
  50.  
  51. public:
  52.     TAbstractCollector() : fFirstBehavior(nil) {}
  53.     virtual ~TAbstractCollector();
  54.  
  55.     virtual TBehavior*                    FirstBehavior() const;
  56.     virtual void                        SetFirstBehavior(TBehavior* firstBehavior);    
  57.     
  58.     virtual void                        AddToCollection(TAbstractScriptableObject*) = 0;
  59.     virtual TAbstractScriptableObject*    CollectionResult() = 0;
  60.  
  61.     virtual long                        CollectorRequest(const TAETransaction& t, long requestID, void* param = nil);
  62.     virtual long                        CollectorRequestDefaultBehavior(const TAETransaction& t, long requestID, void* param = nil);
  63.  
  64.     TCollectorBehavior*                    FirstCollectorBehavior() const { return (TCollectorBehavior*)this->FirstBehaviorOfClass(clCollectorBehavior); }
  65.  
  66. };
  67.  
  68. enum
  69. {
  70.     kWaitForAsyncSearchesToComplete = 'wait',    // Search engines that search asynchronously should
  71.                                                 // add a behavior that blocks the current thread when
  72.                                                 // this message is received
  73.     
  74.     kAsyncSearchesComplete = 'qdn?',            // Search engines that search asynchonously should
  75.     kAsyncSearchIsComplete = 'done',            // attach a collection behavior that answers this question
  76.     kAsyncSearchNotComplete = 'notd',            // (kAsyncSearchesComplete) with either kAsyncSearchIsComplete or kAsyncSearchNotComplete
  77.     
  78.     kSearchShouldIterateBackwards = 'bak?',        // Search engines with no defined sequence should ignore this
  79.     kCollectionIsFull = 'stop',                    // Search engines should ask this question and abort if true is returned
  80.     
  81.     kUnknownCollectorRequest = 0x7FFFFFFF
  82. };
  83.  
  84. //========================================================================================
  85. //    Classs TObjectCollector
  86. //========================================================================================
  87.  
  88. class TObjectCollector : public TAbstractCollector
  89. {
  90. private:
  91.     TMarkToken*                            fCollection;
  92.     TDescriptor                            fScopeOfSearch;
  93.     unsigned char                        fCollectionFull;                // Used to flag collection full when doing "first item whose" or "last item whose"
  94.     unsigned char                        fIterateBackwards;                // Used to do "last item"
  95.     
  96.     long                                fStartOfRange;                    // These three longwords are only used for implementing ranged
  97.     long                                fEndOfRange;                    // whose clauses (rare), such as "items 10 through 20 whose..."
  98.     long                                fNumberOfItemsAdded;
  99.     unsigned long                        fPostProcessListStart;            // These are used for special ranges (for example, middle or any)
  100.     unsigned long                        fPostProcessListStop;            // This indicates if just one item should be taken, or all after the
  101.                                                                         // one specified by fPostProcessListStart should be used (for range: 1 to middle item, for example)
  102.     
  103. public:
  104.     TObjectCollector(TDescriptor scopeOfSearch);
  105.     
  106.     virtual void                        AddToCollection(TAbstractScriptableObject*);
  107.     virtual long                        CollectorRequestDefaultBehavior(const TAETransaction& t, long requestID, void* param = nil);
  108.     virtual TAbstractScriptableObject*    CollectionResult();    
  109.  
  110.     static void                            InterpretWhoseRangeEntry(TDescriptor rangeEntry, long& start, long& end, unsigned long& special);
  111. };
  112.  
  113. #endif
  114.